package com.example.system.class12;

import java.util.ArrayList;
import java.util.List;

/**
 * @Date 2022/7/30
 * @Author Jonathan
 * @Description 二叉树的序列化和重建
 */
public class Code01_SerializeAndReconstructBT {
    private static int index = 0;

    public static void main(String[] args) {
        String str = "1,2,3,#,#,#,4,#,#";
        Node root = reconstruct(str);
        System.out.println(root);
        final String serialize = serialize(root);
        System.out.println(serialize);
    }


    static class Node {
        Node left;
        Node right;
        int value;

        public Node(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Node[" +
                    "value=" + value +
                    ']';
        }
    }

    /**
     * @param str 序列化的字符串
     * @return 头结点
     */
    static Node reconstruct(String str) {
        if (str == null || str.length() <= 0) {
            return null;
        }
        final String[] arr = str.split(",");
        return reconstruct(arr);
    }

    static Node reconstruct(String[] arr) {
        // index全局计数 使用之后计数加一
        final String value = arr[index++];
        if (value.equals("#")) {
            return null;
        }
        System.out.printf("index:%d,arr[index]:%s\n", index, value);
        Node node = new Node(Integer.parseInt(value));
        node.left = reconstruct(arr);
        node.right = reconstruct(arr);
        return node;
    }

    static String serialize(Node root) {
        // 为什么传字符串不行呢?
        List<String> ans = new ArrayList<>();
        serialize(root, ans);
        return String.join(",", ans);
    }

    // 序列化
    static void serialize(Node root, List<String> ans) {
        if (root == null) {
            ans.add("#");
            return;
        }
        ans.add(String.valueOf(root.value));
        serialize(root.left, ans);
        serialize(root.right, ans);
    }

    // 层次序列化和反序列化
    // 和一道题目

}
